home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Extra 1996 #5 / Amiga Plus Extra 1996 May.iso / editoren / instiff / inst2iff.c < prev    next >
C/C++ Source or Header  |  1996-08-01  |  5KB  |  164 lines

  1. /***********************************************************************/
  2. /*       inst2iff.c                                August 3, 1986      */
  3. /*                                                                     */
  4. /* Converts sampled sound files on the Instruments dealer demo disks   */
  5. /* to IFF sampled sound files (FORM 8SVX).                             */
  6. /*                                                                     */
  7. /* This program is unconditionally placed in the public domain.  Feel  */
  8. /* free to use code from it for anything you want (even for commercial */
  9. /* purposes).  However, don't just sell this program.  Make some       */
  10. /* improvements first.  Let's see some music programs out there!!!     */
  11. /*                                                                     */
  12. /* Author:  Bobby Deen                                                 */
  13. /*          2506 Morning Glory                                         */
  14. /*          Richardson, Tx. 75081                                      */
  15. /*          (214) 235-4391  (voice)                                    */
  16. /* Send Electronic Mail to:                                            */
  17. /*          Rising Star BBS @ (214) 231-1372 (Echomail)                */
  18. /*       or Amiga Scope BBS @ (214) 288-1537                           */
  19. /***********************************************************************/
  20.  
  21. #include "exec/types.h"
  22. #include "exec/memory.h"
  23. #include "libraries/dosextens.h"
  24. #include "iff_8svx.h"
  25.  
  26. struct CompressedSample {
  27.    UWORD technique;
  28.    UWORD numSegments;
  29.    UWORD loopStart;
  30.    UBYTE highOctSize;
  31.    UBYTE lowOctSize;
  32. };
  33.  
  34.  
  35. main(argc, argv)
  36. int argc;
  37. char *argv[];
  38. {
  39. int offset;
  40.  
  41. if (argc != 4 && argc != 5) {
  42.    usage(argv[0]);
  43.    exit(10);
  44. }
  45.  
  46. offset = 0;
  47. if (argc == 5) {
  48.    offset = atoi (argv[4]);
  49.    if (offset < -9 || offset > 2)
  50.       printf("\nWarning: Octave offset should be in the range -9 to 2\n");
  51. }
  52.  
  53. convert_inst2iff (argv[1], argv[2], argv[3], offset);
  54.  
  55. printf("Done\n");
  56. exit(0);
  57.  
  58. }
  59.  
  60. /************************************************************************/
  61.  
  62. convert_inst2iff (origname, IFFname, sampname, offset)
  63. char *origname, *IFFname, *sampname, offset;
  64. {
  65. struct CompressedSample samp;
  66. struct Voice8Header v8hdr;
  67. int status, segsize, size;
  68. long sampfile, IFFfile;
  69. UBYTE *waveform;
  70.  
  71. sampfile = Open(origname, MODE_OLDFILE);
  72. if (sampfile == 0) {
  73.    Close(sampfile);
  74.    error ("can't open sample file");
  75. }
  76.  
  77. status = Read (sampfile, &samp, sizeof (samp));
  78. if (status != sizeof(samp)) {
  79.    Close(sampfile);
  80.    error ("can't read sample file");
  81. }
  82.  
  83. size = 0;
  84. v8hdr.ctOctave = samp.lowOctSize-samp.highOctSize+1;
  85. segsize = 1 << (samp.highOctSize);
  86. v8hdr.oneShotHiSamples = samp.loopStart * segsize;
  87. v8hdr.repeatHiSamples = (samp.numSegments - samp.loopStart) * segsize;
  88. /* (3579545 clocks/sec) / (214 clocks/sample) / (261.6 cycles/sec) */
  89. /* = 64 samples/cycle         (calculated for middle C)            */
  90. if (offset >= 0)  /* each octave is a power of 2 difference in the length */
  91.    v8hdr.samplesPerHiCycle = 64 >> offset;
  92. else
  93.    v8hdr.samplesPerHiCycle = 64 << offset;
  94. /*  convert samples per low cycle to samples per hi cycle */
  95. /*  high octaves are basically useless, though */
  96. v8hdr.samplesPerHiCycle >>= (v8hdr.ctOctave-1);
  97. v8hdr.samplesPerSec = 16726; /* = 214 playback rate = C (B on music demo) */
  98. v8hdr.sCompression = sCmpNone;
  99. v8hdr.volume = Unity;
  100.  
  101. /* 2^0 + 2^1 + 2^2 + ... + 2^(n-1) = 2^n - 1 */
  102. size = ((1 << v8hdr.ctOctave) - 1)
  103.             * (v8hdr.oneShotHiSamples + v8hdr.repeatHiSamples);
  104.  
  105. /* MEMF_CHIP not needed since we are not playing the samples */
  106.  
  107. waveform = (UBYTE *)AllocMem (size, MEMF_PUBLIC);
  108. if (waveform == NULL) {
  109.    Close (sampfile);
  110.    error ("can't allocate waveform");
  111. }
  112.  
  113. status = Read (sampfile, waveform, size);
  114. Close (sampfile);
  115. if (status != size) {
  116.    FreeMem (waveform, size);
  117.    error ("can't read waveform");
  118. }
  119.  
  120. /* Now write the sound back out to an IFF file */
  121.  
  122. IFFfile = Open (IFFname, MODE_NEWFILE);
  123. if (IFFfile == 0) {
  124.    FreeMem (waveform, size);
  125.    error ("can't open IFF file");
  126. }
  127.  
  128. status = PutSamp (IFFfile, &v8hdr, sampname, NULL, "Commodore-Amiga",
  129.                "From Dealer Demo Instruments disk", waveform, size);
  130.  
  131. Close(IFFfile);
  132. FreeMem (waveform, size);
  133.  
  134. if (status)
  135.    error (IffErr());
  136.  
  137. }
  138.  
  139. usage(pname)
  140. char *pname;
  141. {
  142. printf("Convert instruments from the Dealer Demo disks to IFF files\n");
  143. printf("\nUsage:\n");
  144. printf("%s InstFileName IFFfileName InstName [octave]\n\n", pname);
  145. printf("where InstFileName = input file name (probably on Instruments: disk\n");
  146. printf("      IFFfileName  = output (IFF) file name\n");
  147. printf("      InstName     = instrument name that goes in IFF file; for example\n");
  148. printf("                       'Guitar', not 'Guitar.samples' or 'Guitar.iff'\n");
  149. printf("      octave       = optional octave offset.  If 'x' key in music demo\n");
  150. printf("                       is 1 octave above middle C, enter 1.  If one\n");
  151. printf("                       octave below, enter -1, etc.  Default = 0\n");
  152.  
  153. }
  154.  
  155. /************************************************************************/
  156.  
  157. error (s)
  158. char *s;
  159. {
  160. printf ("%s\n", s);
  161. exit(20);
  162. }
  163.  
  164.